package com.micro.balance;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;

import org.springframework.stereotype.Component;

/**
 * 权重随机负载均衡策略
 *
 * 该策略根据服务实例的权重进行随机选择。实例的权重决定了它被选中的概率，
 * 权重越高，被选中的概率越大。这种方式可以在保证随机性的同时，也考虑到
 * 服务实例的实际处理能力。
 */
@Component("randomweight")
public class RandomWeightLoadBalance extends AbstractLoadBalance{

    /**
     * 执行加权随机选择的逻辑
     *
     * @param map 一个包含服务实例及其权重的映射
     * @return 返回选中的服务实例标识
     */
	@Override
	protected String doSelect(Map<String, Integer> map) {
		// 创建一个列表，用于存放根据权重展开后的服务实例标识
		ArrayList<String> lists = new ArrayList<String>();

		// 根据权重来生成比重的数据放入List集合
		// 权重越大的实例，其标识在列表中出现的次数越多，被选中的概率越大
		Iterator<String> iterator = map.keySet().iterator();
		while (iterator.hasNext()) {
			String key=iterator.next();
			Integer weight=map.get(key);

			for (int i = 0; i < weight; i++) {
				lists.add(key);
			}
		}
		// 开始随机
		// 通过随机数生成器在列表的索引范围内产生一个随机数，
		// 然后根据随机数选取对应的服务实例标识
		int len = lists.size();
        Random random = new Random();
        int index = random.nextInt(len);
        
        return lists.get(index);
	}

}
